perm filename SPRNG1.SAI[VIS,HPM] blob sn#126072 filedate 1974-10-20 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "SPRING"
C00009 00003	MAIN PROGRAM
C00011 ENDMK
C⊗;
BEGIN "SPRING"
REQUIRE "WINNIC.SAI[VIS,HPM]" SOURCE_FILE;
REQUIRE "HELIB[1,3]" LIBRARY;
EXTERNAL INTEGER BCLIP,TCLIP;

MAKPIX(200,200,4);
TCLIP←0; BCLIP←7;
BEGIN "INNER"
INTEGER ARRAY PIC[1:2,1:PICSIZ];


INTEGER WINDOW,WHIPIX,CORWIN;
REAL TX,TY;
INTEGER ARRAY FEAT[1:3,1:4,1:100];

WINDOW←12;
MAKPIX(200,200,4); INIWIN(WINDOW);
 BEGIN
 INTEGER CURPIC,PREPIC;
 INTEGER ARRAY PIC[1:2,1:PICSIZ];
 
 INTEGER PROCEDURE HORIZON;
  BEGIN
  INTEGER ARRAY WINS[-1:VERWIN,1:HORWIN];
  INTEGER SUM,I,J,NF;
  INTEGER DX1,DX2,DY1,DY2,T,BST,BSTBST,H,SCANX,SCANY;
  SUM←DOWIN(PIC[PREPIC,1],WINS[1,1]);
  NF←0;
  FOR I←2 STEP 1 UNTIL VERWIN-3 DO
  FOR J←3 STEP 1 UNTIL HORWIN-2 DO
  IF (WINS[I,J] LAND 1)=0 ∧ WINS[I,J]≥SUM THEN
   BEGIN
   FEAT[1,PREPIC,NF←NF+1]←(J-1)*WINDOW+1;
   FEAT[2,PREPIC,NF]←(I-1)*WINDOW+1;
   FEAT[3,PREPIC,NF]←WINS[I,J];
   END;

  WINDOW←CORWIN;
  INIWIN(WINDOW);
  TX←WINDOW/PICWID;
  TY←WINDOW/PICHIG;
  BSTBST←'377777000000;
  DO
   BEGIN
   H←1; BST←0;
   FOR I←1 STEP 1 UNTIL NF%2 DO
   IF FEAT[3,PREPIC,I]>BST ∧ FEAT[3,PREPIC,I]<BSTBST ∧
      FEAT[1,PREPIC,I]≥PICWID/3 ∧ FEAT[1,PREPIC,I]≤2*PICWID/3 THEN
        BEGIN H←I; BST←FEAT[3,PREPIC,I]; END;
   BSTBST←BST;
   SCANY←10; SCANX←60;
   DX1←1 MAX (FEAT[1,PREPIC,H]-SCANX);
   DY1←1 MAX (FEAT[2,PREPIC,H]-SCANY);
   DX2←PICWID MIN (FEAT[1,PREPIC,H]+SCANX+WINDOW-1);
   DY2←PICHIG MIN (FEAT[2,PREPIC,H]+SCANY+WINDOW-1);
   T←BSTCOR(PIC[PREPIC,1],FEAT[1,PREPIC,H],FEAT[2,PREPIC,H],
	FEAT[1,PREPIC,H]+WINDOW-1,FEAT[2,PREPIC,H]+WINDOW-1,
	PIC[CURPIC,1],DX1,DY1,DX2,DY2);
   FEAT[1,CURPIC,H]←DX1; FEAT[2,CURPIC,H]←DY1; FEAT[3,CURPIC,H]←T;
   END UNTIL T≤8 ∨ BST=0;
  RETURN(IF BST=0 THEN 0 ELSE H);
  END;

 PROCEDURE PICTURE(INTEGER PICNO);
  BEGIN
  INTEGER ARRAY TEMPIC[1:PICSIZ],HIST[0:2↑PICBIT-1];
  EXTERNAL INTEGER FLINE,LLINE,LSIDE,RSIDE;
  EXTERNAL INTEGER TVWORD,TVCAM,HOFF,VOFF,ERROR;
  EXTERNAL PROCEDURE TVIN;
  INTEGER I,J,BP,PMAX,PMIN;
  FLINE←(256-PICHIG)%2;
  LLINE←FLINE+PICHIG-1;
  LSIDE←(333-PICWID)%2;
  RSIDE←LSIDE+PICWID-1;
  TVWORD←(-PICSIZ LSH 18) LOR LOCATION(PIC[PICNO,1])-1;
  TVCAM←0;
  HOFF←0;
  VOFF←0;
  ERROR←1;
  TCLIP←0; BCLIP←7;
  TVIN;
  BP←POINT(PICBIT,PIC[PICNO,1],-1);
  FOR I←1 STEP 1 UNTIL 2↑PICBIT-1 DO HIST[I]←0; HIST[0]←-(PICWIZ-PICWID)*PICHIG;
  FOR I←PICWIZ*PICHIG STEP -1 UNTIL 1 DO
   BEGIN J←ILDB(BP); HIST[J]←HIST[J]+1; END;
  PMAX←PICWID*PICHIG/9;
  FOR I←0 STEP 1 UNTIL 2↑PICBIT-1 DO OUTSTR(CVS(I)&" - "&CVS(HIST[I])&'15&'12);
  PMIN←0; I←-1;
  WHILE PMIN<PMAX DO BEGIN I←I+1; PMIN←PMIN+HIST[I]; END;
  BCLIP←((18-I)*7)%16;
  PMIN←0; I←2↑PICBIT;
  WHILE PMIN<PMAX DO BEGIN I←I-1; PMIN←PMIN+HIST[I]; END;
  TCLIP←((18-I)*7)%16-1;
  TVIN;
"  CLEAN(TEMPIC[1]); PASSHI(TEMPIC[1],PIC[PICNO,1])";
  DDINIT;
  SCREEN(-2,-2,2,2);
  DRKEN; RECTAN(-2,-2,2,2);
  FOR I←4 STEP -1 UNTIL (5-PICBIT) MAX 0 DO
   BEGIN
   VIDEO(-1,-1,1,1,PIC[PICNO,1],2↑(PICBIT+I-5));
   FOR J←1,2,3 DO DPYUP(SYNMAP(I));
   END;
  END;

 PROCEDURE FORWARD(INTEGER TIME);
  BEGIN
  OUTSTR("FORWARD"&CVS(TIME)&'15&'12);
   OUTSTR("TCLIP("&CVS(TCLIP)&"):"); TCLIP←CVD(INCHWL);
   OUTSTR("BCLIP("&CVS(BCLIP)&"):"); BCLIP←CVD(INCHWL);
  END;

 PROCEDURE STEER(INTEGER TIME);
  BEGIN
  OUTSTR("STEER "&CVS(TIME)&'15&'12);
  END;

 BOOLEAN PROCEDURE LOCFEAT(INTEGER H; comment feature number;
					INTEGER PIC1,PIC2);
  BEGIN
  INTEGER SCANX,SCANY,DX1,DX2,DY1,DY2,T;
  SCANX←30; SCANY←10;
  DX1←1 MAX (FEAT[1,PIC1,H]-SCANX);
  DY1←1 MAX (FEAT[2,PIC1,H]-SCANY);
  DX2←PICWID MIN (FEAT[1,PIC1,H]+SCANX+WINDOW);
  DY2←PICHIG MIN (FEAT[2,PIC1,H]+SCANY+WINDOW);
  T←BSTCOR(PIC[PIC1,1],FEAT[1,PIC1,H],FEAT[2,PIC1,H],
		FEAT[1,PIC1,H]+WINDOW-1,FEAT[2,PIC1,H]+WINDOW-1,
		PIC[PIC2,1],DX1,DY1,DX2,DY2);
  FEAT[1,PIC2,H]←DX1; FEAT[2,PIC2,H]←DY1; FEAT[3,PIC2,H]←T;
  RETURN(IF T>11 THEN FALSE ELSE TRUE);
  END;
COMMENT MAIN PROGRAM;
 CURPIC←1; PREPIC←2;
 PICTURE(CURPIC);
 WHILE TRUE DO
  BEGIN
  INTEGER N,HORFEAT; BOOLEAN LOST;
  N←0;
  DO			comment acquire a horizon feature;
   BEGIN
   FORWARD(5);
   PICTURE(PREPIC); CURPIC↔PREPIC;
   END UNTIL (HORFEAT←HORIZON)≠0 ∨ (N←N+1)>5;
   STEER((FEAT[1,CURPIC,HORFEAT]-FEAT[1,PREPIC,HORFEAT])/10);

  DO			comment now track it as long as possible;
   BEGIN
   FORWARD(5);
   PICTURE(PREPIC); CURPIC↔PREPIC;
   LOST←LOCFEAT(HORFEAT,PREPIC,CURPIC);
   IF ¬LOST THEN STEER((FEAT[1,CURPIC,HORFEAT]-FEAT[1,3-CURPIC,HORFEAT])/10);
   END UNTIL LOST;
  END;


 END;
END;
END;